#include <iostream>
#include <vector>
#include <memory>
class Test
{
public:
    Test() { a = new int; }
    Test(const Test &t)
    {
        std::cout << "拷贝构造" << std::endl;
        a = new int(*t.a);
    }

    Test(Test &&t) // 右值引用  移动构造函数
    // 夺取内存所有权
    {
        std::cout << "移动构造\n";
        a = t.a;
        t.a == nullptr;
    }

private:
    int *a;
};

int main()
{
    // 左值 : 有内存的值
    // 右值 : 常量 将亡值   rvo

    // int a = 10;
    // int &b = a; //左值引用

    // const int &c = 10;  // 常引用

    // int &&c = 10; //右值引用

    // move : 将左值变成右值
    // 移动语义
    // int &&c = std::move(a);

    // std::vector<int> v = {1,2,3,4,5};
    // .....

    // std::vector<int> v2 = v;

    // Test t1;
    // Test t2 = t1; // 调用拷贝构造

    // Test t1;
    // Test t2 = std::move(t1); // 调用移动构造

    // STL支持移动语义
    // std::vector<std::vector<int>> v;

    // std::vector<int> v1 = {1,2,3,4,5};
    // v.push_back(std::move(v1));

    // std::unique_ptr<int> p = std::make_unique<int>();

    // *p = 10;

    // auto p1 = std::move(p);
    // std::cout<<*p1<<std::endl;

    // auto p1 = p;

    // std::vector<std::unique_ptr<int>> v;

    // std::unique_ptr<int> p = std::make_unique<int>();

    // v.push_back(std::move(p));


    
    return 0;
}